package net.uzen.office.photo;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.uzen.office.board.model.Board;
import net.uzen.office.common.UzenOfficeConstants;
import net.uzen.office.common.controller.BaseController;
import net.uzen.office.common.model.SessionInfo;
import net.uzen.office.common.util.SessionUtil;
import net.uzen.office.photo.model.Photo;
import net.uzen.office.photo.model.PhotoComment;
import net.uzen.office.photo.service.PhotoService;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;

public class PhotoController extends BaseController {

	private static final Log logger = LogFactory.getLog(PhotoController.class);

	private PhotoService photoService;

	public void setPhotoService(PhotoService photoService) {
		this.photoService = photoService;
	}

	public void photoList(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {
		try {
			String authUrl = "http://flickr.com/services/auth/?api_key=03f3fab85e2cd28de1fb969b320768bc&perms=delete&api_sig=2047629c1061124cd6eed8f4e6488c71";
			response.sendRedirect(authUrl);
		} catch (Exception e) {

		}
	}

	public ModelAndView list(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {

		// TODO : Validation
		// 검색할 것을 대비 하여 Validation 을 해야한다.

		// 초기 조건은 없으므로 사진 전체 목록을 가져온다.
		// 1. 포토 셋을 골랐을 경우 해당 셋의 목록을 가져온다.
		// 2. 셋을 고르는 것과 상관없이 모든 셋의 목록을 가져온다.
		// 3. 조건이 있을 경우 해당하는 목록을 가져올 수 있도록 한다.
		// 4. frob 및 token 을 가져오기
		Map<String, Object> requestMap = new HashMap<String, Object>();
		requestMap.put("request", request);

		List<Photo> photoList = photoService.getPhotoList(requestMap);
		// List<PhotoSet> photoSetList = photoService.getPhotoSetList();

		// auth_token 이 없을 경우에 가져온다.
		if (StringUtils.isEmpty(photo.getAuth_token())) {
			photo.setAuth_token(photoService.getAuthToken(photo));
		}

		ModelAndView mav = new ModelAndView();
		mav.addObject("photoList", photoList);
		// mav.addObject("photoSetList", photoSetList);
		mav.addObject("photo", photo);

		return mav;
	}

	public ModelAndView form(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {

		ModelAndView mav = new ModelAndView();
		mav.addObject("photo", photo);

		// 수정 폼일 경우 내용을 가져와서 출력한다.
		if (UzenOfficeConstants.FORM_MODE_MODIFY.equals(photo.getMode())) {
			// 수정 폼은 출력이 가능한 경우에만 출력한다.
			// 1. 레코드 등록자와 로그 인 사용자가 같을 때
			// 2. 로그 인 사용자가 관리자일 때
			SessionInfo si = SessionUtil.getSession(request);
			photo.setCreatorNo(si.getMemberNo());

			if (photo.getCreatorNo() != si.getMemberNo()
					&& !SessionUtil.isAdminSession(request)) {
				photo.setAuthorized(false);
			}

			Photo resultPhoto = photoService.getPhoto(photo);

			if (resultPhoto == null) {
				// 수정 폼에 넣을 데이터를 가져올 수 없다. 즉, 수정 권한이 없다.
				// TODO : 에러처리
			}

			mav.addObject("photo", photo);
		}

		return mav;
	}

	public void geAuthorization(HttpServletRequest request,
			HttpServletResponse response) {

		// try {
		// String perms = "delete";
		// String api_sig = SECRET + "api_key" + API_KEY + "perms" + perms;
		// String dest = "http://flickr.com/services/auth/?api_key=" + API_KEY
		// + "&perms=" + perms + "&api_sig=" + getMD5Hash(api_sig);
		//
		// response.setContentType("text/plain; charset=UTF-8");
		// response.getOutputStream().write(dest.getBytes());
		//
		// } catch (Exception e) {
		//
		// }

	}

	public ModelAndView create(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {

		// TODO : Validation

		// 등록 기본 정보를 셋팅한다.
		SessionInfo si = SessionUtil.getSessionInfo(request);
		photo.setCreatorNo(si.getMemberNo());
		photo.setModifierNo(si.getMemberNo());

		// Photo 정보를 등록한다.
		String photoId = photoService.createPhoto(photo);

		if (StringUtils.isEmpty(photoId)) {
			// TODO: 에러 처리
		}

		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("photoId", photoId);
		paramMap.put("auth_token", photo.getAuth_token());

		return new ModelAndView("redirect:/photo/read.jude", paramMap);
	}

	public ModelAndView modifyForm(HttpServletRequest request,
			HttpServletResponse response, Board board) {
		// SessionUtil 에 어드민인지 확인하는거 추가
		// Admin 인지 아닌지 확인하고 Admin 인 경우 Admin 으로 셋팅한다.

		// 수정 폼 출력이 가능한 경우
		// 1. 레코드 등록자와 로그 인 사용자가 같을 때
		// 2. 로그 인 사용자가 관리자일 때
		SessionInfo si = SessionUtil.getSession(request);
		board.setCreatorNo(si.getMemberNo());
		if (board.getCreatorNo() != si.getMemberNo()
				&& !SessionUtil.isAdminSession(request)) {
			board.setAuthorized(false);
		}

		// Board board2Modify = boardService.getBoard(board);

		// if (board2Modify == null) {
		// 수정 폼에 넣을 데이터를 가져올 수 없다. 즉, 수정 권한이 없다.
		// TODO : 에러처리
		// }

		ModelAndView mav = new ModelAndView();
		// mav.addObject("board", board2Modify);
		return mav;
	}

	public ModelAndView modify(HttpServletRequest request,
			HttpServletResponse response, Board board) {

		// TODO : Validation

		// 수정이 가능한 경우
		// 1. 레코드 등록자와 로그 인 사용자가 같을 때
		// 2. 로그 인 사용자가 관리자일 때
		SessionInfo si = SessionUtil.getSessionInfo(request);
		board.setCreatorNo(si.getMemberNo());
		board.setModifierNo(si.getMemberNo());

		if (board.getCreatorNo() != si.getMemberNo()
				&& !SessionUtil.isAdminSession(request)) {
			board.setAuthorized(false);
		}

		// Board 정보를 수정한다.
		// if (!boardService.modifyBoard(board)) {
		// TODO : 에러 처리
		// }

		Map<String, Integer> paramMap = new HashMap<String, Integer>();
		paramMap.put("boardNo", board.getBoardNo());

		return new ModelAndView("redirect:/board/read.jude", paramMap);
	}

	public ModelAndView read(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {
		logger.debug(" >> read ");
		logger.debug(photo.toString());
		// TODO : Validation

		// Board boardResult = boardService.getBoard(board);
		// if (boardResult == null) {
		// TODO: 에러 처리
		// }

		ModelAndView mav = new ModelAndView();
		mav.addObject("photo", photo);

		return mav;
	}

	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response, Board board) {

		// TODO : Validation

		// if (!boardService.deleteBoard(board.getBoardNo())) {
		// TODO : 에러 처리
		// }

		return new ModelAndView("redirect:/board/list.jude");
	}

	public ModelAndView test(HttpServletRequest request,
			HttpServletResponse response, Photo photo) {

		// TODO : Validation

		// if (!boardService.deleteBoard(board.getBoardNo())) {
		// TODO : 에러 처리
		// }

		ModelAndView mav = new ModelAndView();
		mav.addObject("photp", photo);

		return mav;
	}

	public void createComment(HttpServletRequest request,
			HttpServletResponse response, PhotoComment comment) {

		logger.debug(" >> createComment ");
		logger.debug(" >> comment.toString() : " + comment.toString());
		
		SessionInfo si = SessionUtil.getSessionInfo(request);
		comment.setCreatorNo(si.getMemberNo());
		comment.setModifierNo(si.getMemberNo());

		if (!photoService.createPhotoComment(comment)) {
			// TODO : 에러처리
		}
		
	}

	public ModelAndView getCommentList(HttpServletRequest request,
			HttpServletResponse response, PhotoComment comment) {
		logger.debug(" >> getCommentList ");
		logger.debug(" >> comment.toString() : " + comment.toString());
		logger.debug(" >> photoID : " + request.getParameter("photoId"));
		

		List<PhotoComment> commentList = photoService
				.getPhotoCommentList(comment);
		
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("commentList", commentList);
		
		return new ModelAndView("jsonView", model);

	}
	
	
	public ModelAndView testJson(HttpServletRequest request,
			HttpServletResponse response) {
		Map model = new HashMap();
		model.put("firstName", "Jude");
		model.put("lastName", "Lee");
		
		return new ModelAndView("jsonView", model);
	}

}
